{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## ATL03 Open data and simple plot of pulse"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This notebook is for pening data with hdf5 and simple visualisation of the photons per one pulse. Created for Unsupervised Surface Classification procject at Hackweek 2020"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**This file must be finished with plotting the correct variables, currently sigma_h is plotted**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "List the downloaded data files and read in data from one of them."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "import h5py\n",
    "import numpy as np\n",
    "from pathlib import Path\n",
    "import pyproj\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Here specify path to data \n",
    "data_home = Path('/home/jovyan/unsupervised_project/download/')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[PosixPath('/home/jovyan/unsupervised_project/download/processed_ATL03_20190525195203_08790305_003_01.h5'), PosixPath('/home/jovyan/unsupervised_project/download/processed_ATL03_20190529194342_09400305_003_01.h5')]\n"
     ]
    }
   ],
   "source": [
    "files = list(data_home.glob('*.h5'))\n",
    "print(files) #list files in directory"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To investigate the structure of the file we can vie the dictionary:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/                        Group\n",
      "/METADATA                Group\n",
      "/METADATA/AcquisitionInformation Group\n",
      "/METADATA/AcquisitionInformation/lidar Group\n",
      "/METADATA/AcquisitionInformation/lidarDocument Group\n",
      "/METADATA/AcquisitionInformation/platform Group\n",
      "/METADATA/AcquisitionInformation/platformDocument Group\n",
      "/METADATA/DataQuality    Group\n",
      "/METADATA/DataQuality/CompletenessOmission Group\n",
      "/METADATA/DataQuality/DomainConsistency Group\n",
      "/METADATA/DatasetIdentification Group\n",
      "/METADATA/Extent         Group\n",
      "/METADATA/Lineage        Group\n",
      "/METADATA/Lineage/ANC01  Group\n",
      "/METADATA/Lineage/ANC03  Group\n",
      "/METADATA/Lineage/ANC04  Group\n",
      "/METADATA/Lineage/ANC05  Group\n",
      "/METADATA/Lineage/ANC06-01 Group\n",
      "/METADATA/Lineage/ANC06-02 Group\n",
      "/METADATA/Lineage/ANC06-03 Group\n",
      "/METADATA/Lineage/ANC07  Group\n",
      "/METADATA/Lineage/ANC08  Group\n",
      "/METADATA/Lineage/ANC11  Group\n",
      "/METADATA/Lineage/ANC12-01 Group\n",
      "/METADATA/Lineage/ANC12-02 Group\n",
      "/METADATA/Lineage/ANC19  Group\n",
      "/METADATA/Lineage/ANC22  Group\n",
      "/METADATA/Lineage/ANC23  Group\n",
      "/METADATA/Lineage/ANC25-03 Group\n",
      "/METADATA/Lineage/ANC26-03 Group\n",
      "/METADATA/Lineage/ANC28  Group\n",
      "/METADATA/Lineage/ANC29  Group\n",
      "/METADATA/Lineage/ANC36-03 Group\n",
      "/METADATA/Lineage/ANC38-03 Group\n",
      "/METADATA/Lineage/ANC41  Group\n",
      "/METADATA/Lineage/ATL02  Group\n",
      "/METADATA/Lineage/Control Group\n",
      "/METADATA/ProcessStep    Group\n",
      "/METADATA/ProcessStep/Browse Group\n",
      "/METADATA/ProcessStep/Metadata Group\n",
      "/METADATA/ProcessStep/PGE Group\n",
      "/METADATA/ProcessStep/QA Group\n",
      "/METADATA/ProductSpecificationDocument Group\n",
      "/METADATA/QADatasetIdentification Group\n",
      "/METADATA/SeriesIdentification Group\n",
      "/ancillary_data          Group\n",
      "/ancillary_data/atlas_sdp_gps_epoch Dataset {1}\n",
      "/ancillary_data/data_end_utc Dataset {1}\n",
      "/ancillary_data/data_start_utc Dataset {1}\n",
      "/ancillary_data/end_delta_time Dataset {1}\n",
      "/ancillary_data/granule_end_utc Dataset {1}\n",
      "/ancillary_data/granule_start_utc Dataset {1}\n",
      "/ancillary_data/start_delta_time Dataset {1}\n",
      "/gt1l                    Group\n",
      "/gt1l/geolocation        Group\n",
      "/gt1l/geolocation/sigma_h Dataset {3294/Inf}\n",
      "/gt1l/geolocation/sigma_lat Dataset {3294/Inf}\n",
      "/gt1l/geolocation/sigma_lon Dataset {3294/Inf}\n",
      "/gt1l/geolocation/surf_type Dataset {3294/Inf, 5}\n",
      "/gt1r                    Group\n",
      "/gt1r/geolocation        Group\n",
      "/gt1r/geolocation/sigma_h Dataset {3322/Inf}\n",
      "/gt1r/geolocation/sigma_lat Dataset {3322/Inf}\n",
      "/gt1r/geolocation/sigma_lon Dataset {3322/Inf}\n",
      "/gt1r/geolocation/surf_type Dataset {3322/Inf, 5}\n",
      "/gt2l                    Group\n",
      "/gt2l/geolocation        Group\n",
      "/gt2l/geolocation/sigma_h Dataset {4305/Inf}\n",
      "/gt2l/geolocation/sigma_lat Dataset {4305/Inf}\n",
      "/gt2l/geolocation/sigma_lon Dataset {4305/Inf}\n",
      "/gt2l/geolocation/surf_type Dataset {4305/Inf, 5}\n",
      "/gt2r                    Group\n",
      "/gt2r/geolocation        Group\n",
      "/gt2r/geolocation/sigma_h Dataset {4332/Inf}\n",
      "/gt2r/geolocation/sigma_lat Dataset {4332/Inf}\n",
      "/gt2r/geolocation/sigma_lon Dataset {4332/Inf}\n",
      "/gt2r/geolocation/surf_type Dataset {4332/Inf, 5}\n",
      "/gt3l                    Group\n",
      "/gt3l/geolocation        Group\n",
      "/gt3l/geolocation/sigma_h Dataset {5316/Inf}\n",
      "/gt3l/geolocation/sigma_lat Dataset {5316/Inf}\n",
      "/gt3l/geolocation/sigma_lon Dataset {5316/Inf}\n",
      "/gt3l/geolocation/surf_type Dataset {5316/Inf, 5}\n",
      "/gt3r                    Group\n",
      "/gt3r/geolocation        Group\n",
      "/gt3r/geolocation/sigma_h Dataset {5345/Inf}\n",
      "/gt3r/geolocation/sigma_lat Dataset {5345/Inf}\n",
      "/gt3r/geolocation/sigma_lon Dataset {5345/Inf}\n",
      "/gt3r/geolocation/surf_type Dataset {5345/Inf, 5}\n",
      "/orbit_info              Group\n",
      "/orbit_info/sc_orient    Dataset {1/Inf}\n",
      "/orbit_info/sc_orient_time Dataset {1/Inf}\n"
     ]
    }
   ],
   "source": [
    "!h5ls -r {files[0]} "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Create a reader to read in the data, extract variables and save them per track in seperate files:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def transform_coord(proj1, proj2, x, y):\n",
    "    \"\"\"Transform coordinates from proj1 to proj2 (EPSG num).\n",
    "\n",
    "    Example EPSG projections:\n",
    "        Geodetic (lon/lat): 4326\n",
    "        Polar Stereo AnIS (x/y): 3031\n",
    "        Polar Stereo GrIS (x/y): 3413\n",
    "    \"\"\"\n",
    "    # Set full EPSG projection strings\n",
    "    proj1 = pyproj.Proj(\"+init=EPSG:\"+str(proj1))\n",
    "    proj2 = pyproj.Proj(\"+init=EPSG:\"+str(proj2))\n",
    "    return pyproj.transform(proj1, proj2, x, y)  # convert\n",
    "\n",
    "\n",
    "\n",
    "def read_atl03(fname, outdir='data'):\n",
    "    \"\"\"Read one ATL03 file and output 6 reduced files. \n",
    "    \n",
    "    Extract variables of interest and separate the ATL03 file \n",
    "    into each beam (ground track) and ascending/descending orbits.\n",
    "    \"\"\"\n",
    "\n",
    "    # Each beam is a group\n",
    "    group = ['/gt1l', '/gt1r', '/gt2l', '/gt2r', '/gt3l', '/gt3r']\n",
    "\n",
    "    # Loop trough beams\n",
    "    for k, g in enumerate(group):\n",
    "    \n",
    "        #-----------------------------------#\n",
    "        # Read in data for a single beam #\n",
    "        #-----------------------------------#\n",
    "        \n",
    "        data = {}\n",
    "    \n",
    "        try:\n",
    "            # Load vars into memory (include as many as you want)\n",
    "            with h5py.File(fname, 'r') as fi:\n",
    "                \n",
    "                data['lat'] = fi[g+'/geolocation/sigma_lat'][:]\n",
    "                data['lon'] = fi[g+'/geolocation/sigma_lon'][:]\n",
    "                data['height'] = fi[g+'/geolocation/sigma_h'][:]\n",
    "                data['surf_type'] = fi[g+'/geolocation/surf_type'][:]\n",
    "\n",
    "                \n",
    "                \n",
    "        except:\n",
    "            print('skeeping group:', g)\n",
    "            print('in file:', fname)\n",
    "            continue\n",
    " \n",
    "        #-----------------------#\n",
    "        # Convert Coordinates #\n",
    "        #-----------------------#\n",
    "        \n",
    "        # Geodetic lon/lat -> Polar Stereo x/y\n",
    "        x, y = transform_coord(4326, 3031, data['lon'], data['lat'])\n",
    "        \n",
    "        data['x'] = x\n",
    "        data['y'] = y\n",
    "        \n",
    "        \n",
    "        #-----------------------#\n",
    "        # Save selected data #\n",
    "        #-----------------------#\n",
    "        \n",
    "        # Define output dir and file\n",
    "        outdir = Path(outdir)    \n",
    "        fname = Path(fname)\n",
    "        outdir.mkdir(exist_ok=True)\n",
    "        outfile = outdir / fname.name.replace('.h5', '_' + g[1:] + '.h5')\n",
    "        \n",
    "        # Save variables\n",
    "        with h5py.File(outfile, 'w') as fo:\n",
    "            for k, v in data.items(): fo[k] = v\n",
    "            print('out ->', outfile)\n",
    " \n",
    "   \n",
    "              "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Here specify outdir \n",
    "outdir = Path('/home/jovyan/unsupervised_project/data/')\n",
    "\n",
    "outdir.mkdir(exist_ok=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Run the reader:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "running in parallel (8 jobs) ...\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=8)]: Using backend LokyBackend with 8 concurrent workers.\n",
      "[Parallel(n_jobs=8)]: Done   2 out of   2 | elapsed:    1.7s remaining:    0.0s\n",
      "[Parallel(n_jobs=8)]: Done   2 out of   2 | elapsed:    1.7s finished\n"
     ]
    }
   ],
   "source": [
    "njobs = 8\n",
    "\n",
    "if njobs == 1:\n",
    "    print('running in serial ...')\n",
    "    [read_atl03(f, outdir) for f in files]\n",
    "\n",
    "else:\n",
    "    print('running in parallel (%d jobs) ...' % njobs)\n",
    "    from joblib import Parallel, delayed\n",
    "    Parallel(n_jobs=njobs, verbose=5)(delayed(read_atl03)(f, outdir) for f in files)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Checking created files:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/home/jovyan/unsupervised_project/data/processed_ATL03_20190525195203_08790305_003_01_gt2r.h5\n",
      "/home/jovyan/unsupervised_project/data/processed_ATL03_20190529194342_09400305_003_01_gt2r.h5\n",
      "/home/jovyan/unsupervised_project/data/processed_ATL03_20190525195203_08790305_003_01_gt2l.h5\n",
      "/home/jovyan/unsupervised_project/data/processed_ATL03_20190529194342_09400305_003_01_gt2l.h5\n",
      "/home/jovyan/unsupervised_project/data/processed_ATL03_20190525195203_08790305_003_01_gt3r.h5\n",
      "/home/jovyan/unsupervised_project/data/processed_ATL03_20190525195203_08790305_003_01_gt1l.h5\n",
      "/home/jovyan/unsupervised_project/data/processed_ATL03_20190529194342_09400305_003_01_gt1l.h5\n",
      "/home/jovyan/unsupervised_project/data/processed_ATL03_20190529194342_09400305_003_01_gt3r.h5\n",
      "/home/jovyan/unsupervised_project/data/processed_ATL03_20190525195203_08790305_003_01_gt3l.h5\n",
      "/home/jovyan/unsupervised_project/data/processed_ATL03_20190529194342_09400305_003_01_gt1r.h5\n",
      "Total number of files: 12\n"
     ]
    }
   ],
   "source": [
    "#outfiles = !ls {outdir}/*.h5\n",
    "outfiles = list(outdir.glob('*.h5'))\n",
    "\n",
    "for f in outfiles[:10]: print(f)\n",
    "print('Total number of files:', len(outfiles))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's check if the expected variables are in the file, and how many measurements we have."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/                        Group\n",
      "/height                  Dataset {4332}\n",
      "/lat                     Dataset {4332}\n",
      "/lon                     Dataset {4332}\n",
      "/surf_type               Dataset {4332, 5}\n",
      "/x                       Dataset {4332}\n",
      "/y                       Dataset {4332}\n"
     ]
    }
   ],
   "source": [
    "!h5ls -r {outfiles[0]}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Reading one of the files and plotting sigma"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [],
   "source": [
    "def read_atl03_track(fname):\n",
    "       \n",
    "    import pandas as pd\n",
    "    data = pd.DataFrame()\n",
    "    \n",
    "    with h5py.File(fname, 'r') as fi:\n",
    "         \n",
    "        data['x'] = fi['x'][:]\n",
    "        data['y'] = fi['y'][:]\n",
    "        data['height'] = fi['height'][:]\n",
    "        return data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              x             y  height\n",
      "0     25.122796  1.236743e+07     0.3\n",
      "1     25.128029  1.236743e+07     0.3\n",
      "2     25.133261  1.236743e+07     0.3\n",
      "3     25.138490  1.236743e+07     0.3\n",
      "4     25.143719  1.236743e+07     0.3\n",
      "...         ...           ...     ...\n",
      "4327  38.687569  1.236743e+07     0.3\n",
      "4328  38.688267  1.236743e+07     0.3\n",
      "4329  38.688967  1.236743e+07     0.3\n",
      "4330  38.689690  1.236743e+07     0.3\n",
      "4331  38.690387  1.236743e+07     0.3\n",
      "\n",
      "[4332 rows x 3 columns]\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "file = list(outdir.glob('*.h5'))[0]\n",
    "\n",
    "data = read_atl03_track(file)\n",
    "\n",
    "print(data)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Plotting the data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7f714999b610>"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "data.plot(x='x', y='y', kind='scatter', c='height', s=1, cmap='inferno')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "clearly I have downloaded the wrong parameter here, instead of the photon point cloud I have height"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
